﻿" vim-plug 配置"""""""""""""""""""""""""""""""""""""""

" 定义自动命令组并清空以免重新导入时重复定义自动命令
augroup plugrc " 定义不能省略
    autocmd!
augroup END    " 恢复默认自动命令组

"" vim-plug 默认的下载根路径。用来生成 Plug 命令后面的相对路径仓库的 url
let g:plug_url_format = 'https://git::@github.com/%s.git'
" github 连接困难，使用可用的镜像地址
" let g:plug_url_format = 'https://git::@hub.fastgit.org/%s.git'

" Specify a directory for plugins (for Neovim: ~/.local/share/nvim/plugged)
call plug#begin(g:johnPath . '/bundle')

" 插件名必须使用单引号。if 0 表示不载入插件。单行的用注释来开关。
" 如果用字符串，前面加感叹号表示载入。这样折叠时可以看到名字。

Plug 'skywind3000/asyncrun.vim', {'on': 'AsyncRun'}
" Plug 'skywind3000/asynctasks.vim'

Plug 'jiangmiao/auto-pairs'    "{{{  这个插件会和小狼毫冲突
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    " 自动跳出，返回用 alt-b。
    let g:AutoPairsFlyMode = 1
    " 载入 session 文件后会不正常，重新初始化一下
    autocmd vimrc SessionLoadPost * call AutoPairsTryInit()
    " alt+p 切换开关状态
endif   "}}}

Plug 'vim-jp/autofmt', { 'frozen': '1', 'for': ['text', 'txt']}    "{{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    " 自动命令
    autocmd plugrc FileType text,txt
                \ setlocal formatexpr=autofmt#uax14#formatexpr()
    " 本文件尾部还有配置
endif   "}}}

if 1  "coc 插件    {{{
    " Plug 'neoclide/coc.nvim', {'branch': 'release'}
    " Plug 'https://hub.fastgit.org/neoclide/coc.nvim.git', {'branch': 'release'}
    " Plug 'https://github.com.cnpmjs.org/neoclide/coc.nvim.git', {'branch': 'release'}
    Plug 'https://gitee.com/mirrors_trending/coc.nvim.git', {'branch': 'release'}
    let g:coc_node_path = $SCOOP . "/apps/nodejs/current/node.exe"
    let $VIMCONFIG = g:johnPath . "/coc"
    let g:coc_data_home=g:johnPath . "/coc"
    let g:coc_config_home=$VIM
    let g:coc_global_extensions=['coc-json', 'coc-tsserver',
            \'coc-yaml', 'coc-vimlsp', 'coc-pyright', 'coc-snippets',
            \'coc-eslint', 'coc-clangd', 'coc-clang-format-style-options',
            \'coc-marketplace']
    " set hidden " 否则有些编辑会失败
    set statusline-=%{coc#status()} " 没有时不会报错
    set statusline+=%{coc#status()}
    " 自动命令
    " autocmd plugrc FileType typescript,json,html,css,python,vim
                \ setlocal formatexpr=CocAction('formatSelected')
    " 显示函数签名。
    au plugrc User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
    " 高亮光标下的符号
    " autocmd plugrc CursorHold * silent call CocActionAsync('highlight')
    " coc 配置文件里的注释显示正常注释颜色而非红色
    au plugrc BufEnter coc-settings.json hi link jsonCommentError Comment
    " 按键映射
    nmap <silent> ]w <Plug>(coc-diagnostic-next)
    nmap <silent> [w <Plug>(coc-diagnostic-prev)
    nmap <silent> ]e <Plug>(coc-diagnostic-next-error)
    nmap <silent> [e <Plug>(coc-diagnostic-prev-error)
    " 重映射跳转键覆盖 vim 默认设置
    " nmap <silent> gd <Plug>(coc-definition)
    " nmap <silent> gy <Plug>(coc-type-definition)
    " nmap <silent> gi <Plug>(coc-implementation)
    " nmap <silent> gr <Plug>(coc-references)
    " 代码片段占位符跳转：<c-j> 和 <c-k>
    " 列表中 <c-o> 切换到 normal 模式
    " 定义一个函数以便设置 tab 键触发自动完成并在菜单中跳转。
    function! s:check_back_space() abort
      let col = col('.') - 1
      return !col || getline('.')[col - 1]  =~ '\s'
    endfunction
    " 设置 tab 键触发自动完成。
    " inoremap <silent><expr> <TAB>
            \ pumvisible() ? "\<C-n>" :
            \ <SID>check_back_space() ? "\<TAB>" :
            \ coc#refresh()

endif    " }}}

Plug 'mbbill/fencview', { 'on': 'FencView' }
Plug 'sillybun/vim-repl', { 'on': 'REPLToggle' }
Plug 'liuchengxu/vista.vim'

Plug 'Yggdroot/indentLine'      " {{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    let g:indentLine_char_list = ['|', '¦']
    " let g:indentLine_char_list = ['|', '¦', '┆', '┊']
    let g:indentLine_setColors = 1
    " 缩进线颜色 (Vim, GVim)
    let g:indentLine_bgcolor_term = 256
    "let g:indentLine_color_gui = '#000000'
    let g:indentLine_bgcolor_gui = '#000000'
endif    " }}}

" Plug 'sbdchd/neoformat'
" Plug 'neomake/neomake'

if 'nerdcommenter'    " {{{ 经常无效，先不用了
    Plug 'scrooloose/nerdcommenter'
    " 注释的时候自动加个空格, 强迫症必配
    let g:NERDSpaceDelims=1
    " <leader>cc       加注释
    " <leader>cu       解开注释
    " <leader>ca       切换注释的样式:/*....*/和//..的切换
    " <leader>c<space> 加上/解开注释, 智能判断
    " <leader>cy       先复制, 再注解(p可以进行黏贴)
    " <leader>cm       块注释
    " <leader>cs       '性感的'注释。就是块注释结合行注释。
endif    " }}}

" 第一次调用 NERDTreeToggle 命令时载入 nerdtree （使用 on 选项）
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }

Plug 'luochen1990/rainbow'      " {{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    let g:rainbow_active = 1
endif    " }}}

Plug 'preservim/tagbar', { 'on': 'Tagbar' } " {{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    let g:tagbar_sort = 0  " 不排序,按标签在文件中的位置
    let g:tagbar_autoclose = 1  " 跳出时自动关闭
    let g:tagbar_autofocus = 1  " 打开时自动跳转过去
    " markdown 需要下面设置。可用 pip install markdown2ctags 在线更新。
    let g:tagbar_type_markdown = {
                \'ctagstype': 'markdown',
                \'ctagsbin' : g:portable
                    \. '/Develop/Python/vPy/Scripts/markdown2ctags.exe',
                \'ctagsargs' : '-f - --sort=yes --sro=»',
                \'kinds' : [
                    \'s:sections',
                    \'i:images'
                \],
                \'sro' : '»',
                \'kind2scope' : {
                    \'s' : 'section',
                \},
                \'sort': 0,
                \}
    " noremap <F8> :TagbarToggle<CR>
    " inoremap <F8> <ESC>:TagbarToggle<CR>
    " cnoremap <F8> <ESC>:TagbarToggle<CR> 
endif   "}}}

Plug 'Chiel92/vim-autoformat'

if 1 "tcomment_vim     {{{
    Plug 'tomtom/tcomment_vim'
    " 按键映射 gcc
    " gc<count>c{motion} 开关注释 gC 按行注释
    " g> 注释 g< 取消注释
    " g>b 块注释。或者 leader_b 或者 Ctrl+_ b 也可以。
endif    " }}}

if 1 " vim-airline     {{{
    Plug 'vim-airline/vim-airline'
    let g:airline#extensions#wordcount#enabled = 1  " 显示文档总字数
    let g:airline#extensions#whitespace#enabled = 0 " 空格错误检测
    let g:airline#extensions#tagbar#enabled = 0  " tagbar 扩展
    let g:airline#extensions#fugitiveline#enabled = 0
    let g:airline#extensions#gutentags#enabled = 1
    let g:airline#extensions#ale#enabled = 0
    let airline#extensions#ale#error_symbol = 'E'
    let airline#extensions#ale#warning_symbol = 'W'
    let airline#extensions#ale#show_line_numbers = 0
    let g:airline#extensions#coc#enabled = 0
    let airline#extensions#coc#error_symbol = 'e'
    let airline#extensions#coc#warning_symbol = 'w'
    " 定制 z 区域
    if !exists('g:airline_symbols')
        let g:airline_symbols = {}
    endif
    let g:airline_symbols.linenr = ''
    let g:airline_symbols.maxlinenr = ''
    let g:airline_section_z = "%p%%%#__accent_bold#
                \%{g:airline_symbols.linenr}%4l%#__restore__#
                \%#__accent_bold#/%L%{g:airline_symbols.maxlinenr}
                \%#__restore__#,%v"
endif    " }}}

Plug 'rhysd/vim-clang-format', {'for': ['cpp', 'c']}

if 1 "vim-clap     {{{
    " 强制下载已经编译好的版本。下载的 maple.exe 会在插件的 bin 目录下。
    Plug 'liuchengxu/vim-clap', {
                \'do': { -> clap#installer#force_download() },
                \'on': 'Clap'
                \}
    let g:clap_popup_border = 'nil' " 有边框会造成第一个字母不显示，关！
    let g:clap_theme = 'material_design_dark'
    let g:clap_open_preview = 'on_move'
    let g:clap_cache_directory = g:johnPath . '/temp/clap'
end    " }}}

Plug 'junegunn/vim-easy-align'          " {{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    map ga <Plug>(EasyAlign)
    ounmap ga
    vmap <Enter> <Plug>(EasyAlign)
    " 右对齐举例：ga<Enter>*<space>
    " 其中，<Enter>切换对齐方式。
    " * 表示所有分隔符都对齐，* 如果是数字表示按第几个分隔符对齐。
    " 两个*表示交替左右对齐。<C-G>切换排除列表。可以按正则对齐。
endif    " }}}

Plug 'tpope/vim-fugitive'

if 1 "vim-gitgutter     {{{
    Plug 'airblade/vim-gitgutter'
    " 明确指定使用哪个 git 命令。*注意*路径里只能使用反斜杠。
    let g:gitgutter_git_executable = $scoop . '\apps\git\current\mingw64\bin\git.exe'
    " 定义标志列高亮
    " highlight GitGutterAdd    guifg=#009900 ctermfg=2
    " highlight GitGutterChange guifg=#bbbb00 ctermfg=3
    " highlight GitGutterDelete guifg=#ff2222 ctermfg=1
    highlight! link GitGutterAdd    Question
    highlight! link GitGutterChange Question
    highlight! link GitGutterDelete Question
    " <leader>hp、hs、hu 分别是显示、缓存、取消光标下的修改。跳转 [c
endif    " }}}

" Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

if 1 "vim-gutentags    {{{
    Plug 'ludovicchabant/vim-gutentags'
    " gutentags 搜索工程目录的标志，碰到这些文件/目录名就停止向上一级目录递归
    let g:gutentags_project_root = ['.git', '.root', '.project']
    let g:gutentags_add_default_project_roots = 0
    let g:gutentags_generate_on_missing = 1 " tag 不存在就创建
    let g:gutentags_generate_on_new = 0 "新项目是否创建 tag 文件
    " 要排除的目录列表
    let g:gutentags_exclude_project_root = [$vim,
                \   $wsr . '\program\vim',
                \   '/usr/local', 'D:\study\vim'
                \   ]
    " 所生成的数据文件的名称
    let g:gutentags_ctags_tagfile = 'tags'
    " 将自动生成的 tags 文件全部放入指定的已存在目录中
    " let g:gutentags_cache_dir = expand(g:Lf_CacheDirectory . '/.LfCache/gtags')
    let g:gutentags_cache_dir = g:johnPath . '/temp/.LfCache/gtags'
    " 如果不存在此目录就创建。
    if !isdirectory(g:gutentags_cache_dir)
        silent! call mkdir(g:gutentags_cache_dir, 'p')
    endif
    "" 配置 ctags 的参数
    let g:gutentags_ctags_extra_args = ['--fields=+niazSt']
    let g:gutentags_ctags_extra_args += ['--c++-kinds=+px', '--c-kinds=+px']
    let g:gutentags_ctags_extra_args += ['--extras=+q']
    " 使用 universal ctags 要增加下面一行参数否则路径名双反斜线 bug 。
    " 下载地址 https://github.com/universal-ctags/ctags-win32/releases
    " LZ 发现此选项有 bug 。如果c++函数都是有参数的，将生成空 tag 文件。
    let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']
endif    "}}}

"" 语法高亮相关 markdown 高亮等等
Plug 'tamlok/vim-markdown', {'for': 'markdown'}
Plug 'joker1007/vim-markdown-quote-syntax', {'for': 'markdown'}  " md 文档里代码高亮
"Plug 'mzlogin/vim-markdown-toc'

Plug 'skywind3000/vim-quickui'          "{{{
if getline(line('.') - 1)[0] != '"' "如果上一行没注释掉则运行
    let g:quickui_show_tip = 1 " 命令行显示提示
    " 载入插件后设置菜单及映射，见最后。
    let s:lz_quickui_loaded = 1
    function! LZuimenu()
        " 先清除一下以免旧菜单影响
        call quickui#menu#reset()
        " install a 'File' menu, use [text, command] to represent an item.
        call quickui#menu#install('文件&F', [
                    \[ "&New File\tCtrl+n", 'echo 0' ],
                    \[ "&Open File\t(F3)", 'echo 1' ],
                    \[ "&Close", 'echo 2' ],
                    \[ "--", '' ],
                    \[ "&Save\tCtrl+s", 'echo 3'],
                    \[ "Save &As", 'echo 4' ],
                    \[ "Save All", 'echo 5' ],
                    \[ "--", '' ],
                    \[ "E&xit\tAlt+x", 'echo 6' ],
                    \])
        " items containing tips, tips will display in the cmdline
        call quickui#menu#install('编辑&E', [
                    \[ '&Copy', 'echo 1', 'help 1' ],
                    \[ '&Paste', 'echo 2', 'help 2' ],
                    \[ '&Find', 'echo 3', 'help 3' ],
                    \])
        " script inside %{...} will be evaluated and expanded in the string
        call quickui#menu#install("&Option", [
                    \['Set &Spell %{&spell? "Off":"On"}', 'set spell!'],
                    \['Set &Cursor Line %{&cursorline? "Off":"On"}',
                            \   'set cursorline!'],
                    \['Set &Paste %{&paste? "Off":"On"}', 'set paste!'],
                    \])
        " C/C++菜单只在文件类型符合时才显示
        call quickui#menu#install('&C/C++', [
                    \[ '&Compile', 'echo 1' ],
                    \[ '&Run', 'echo 2' ],
                    \], '<auto>', 'c,cpp,vim')
        " register HELP menu with weight 10000
        call quickui#menu#install('H&elp', [
                    \["&Cheatsheet", 'help index', ''],
                    \['T&ips', 'help tips', ''],
                    \['--',''],
                    \["&Tutorial", 'help tutor', ''],
                    \['&Quick Reference', 'help quickref', ''],
                    \['&Summary', 'help summary', ''],
                    \], 10000)
        call quickui#menu#open()
    endfunction
    " 定义弹出菜单（列表）
    let content = [
                \[ 'clap 所有列表', 'Clap!' ],
                \[ '--------------', ''],
                \[ 'clap 文件列表 &C', 'Clap! files' ],
                \[ 'fzf 文件列表 &F', 'FZF' ],
                \[ 'c&Oc 大纲', 'CocList outline' ],
                \[ '--------------', ''],
                \[ '打开菜单 &M', 'call LZuimenu()' ],
                \]
    let opts = {'title': '快捷命令'}
    noremap <silent> <F3> :call quickui#listbox#open(content, opts)<CR>
    let content1 = [
                \[ 'clap 列表', 'Clap!' ],
                \[ '--------------', ''],
                \[ 'clap 文件 &C', 'Clap! files' ],
                \[ 'fzf 文件列表 &F', 'FZF' ],
                \[ '--------------', ''],
                \[ '打开菜单 &M', 'call LZuimenu()' ],
                \]
    let opts1 = {'title': '文件搜索'}
    noremap <silent> <F2> :call quickui#listbox#open(content1, opts1)<CR>
endif    " }}}

" 添加 sa{motion/textobject}{addition} 删除 sdb or sd{deletion}
" 替换 srb{addition} or sr{deletion}{addition}
Plug 'machakann/vim-sandwich'

Plug 'honza/vim-snippets'

" 大写 S 可以包括换行。左括号包含空格。可视模式用大写 S。
Plug 'tpope/vim-surround'

Plug 'mbbill/undotree', { 'on': 'UndotreeToggle' }
Plug 'yianwillis/vimcdoc'

if has('python3')

    Plug 'https://gitee.com/mirrors/fzf.git'     " {{{
    " 需要 fzf.exe 在路径中。地址 https://github.com/junegunn/fzf-bin/releases
    " fzf 插件算是基础插件
    " fzf.vim 插件映射快捷键和命令，依赖于上面插件。
    " Plug 'junegunn/fzf.vim'
    " 如果可能跳到已存在窗口
    let g:fzf_buffers_jump = 1
    " 使用 quickui 打开，不要记那么多命令。 }}}

    Plug 'Yggdroot/LeaderF'      " {{{
    let g:Lf_DefaultMode = 'NameOnly'
    let g:Lf_WorkingDirectoryMode = 'Ac'
    " 使用缓存
    let g:Lf_UseCache = 1
    let g:Lf_CacheDirectory = g:johnPath . '/temp/LeaderF'
    " let  g:Lf_GtagsGutentags = 1
    " let g:gutentags_cache_dir = expand(g:Lf_CacheDirectory .'/.LfCache/gtags')
    " 使用浮动窗口
    let g:Lf_WindowPosition = 'popup'
    let g:Lf_PreviewInPopup = 1
    let g:Lf_PreviewResult = {'Function': 0, 'BufTag': 0 }
    let g:Lf_UseVersionControlTool = 0
    " 索引排除的
    let g:Lf_WildIgnore = {
            \ 'dir': ['.svn','.git','.hg'],
            \ 'file': ['*.sw?','~$*','*.bak','*.exe','*.o','*.so','*.py[co]']
            \ }
    let g:Lf_IgnoreCurrentBufferName = 1
    " 不想记录的文件
    let g:Lf_MruFileExclude = {
            \ 'dir': ['.git', 'doc'],
            \ 'file': ['*.cnx', '*.so', '*.tmp*']
            \}
    " 不想显示的文件
    let g:Lf_MruWildIgnore = g:Lf_MruFileExclude
    " 不想显示的历史命令
    let g:Lf_HistoryExclude = {
            \ 'cmd': ['^w!?', '^q!?', '^.\s*$'],
            \ 'search': ['^Plug']
            \}
    " gtags 配置
    let g:Lf_Global = $VIM . "/cmd4vim/glo668wb/bin/global.exe"
    let g:Lf_Gtags = $VIM . "/cmd4vim/glo668wb/bin/gtags.exe"
    let g:Lf_Gtagsconf = $VIM . "/cmd4vim/glo668wb/share/gtags/gtags.conf"
    let g:Lf_Gtagslabel = 'native-pygments'
    let g:Lf_GtagsAutoGenerate = 0
    " 按键映射
    let g:Lf_ShortcutF = "<leader>ff"
    " let g:Lf_ShortcutB = "<leader>fb"
    noremap <leader>fb :<C-U><C-R>=printf("Leaderf buffer --all %s", "")<CR><CR>
    noremap <leader>fm :<C-U><C-R>=printf("Leaderf mru %s", "")<CR><CR>
    noremap <leader>ft :<C-U><C-R>=printf("Leaderf bufTag %s", "")<CR><CR>
    noremap <leader>fl :<C-U><C-R>=printf("Leaderf line %s", "")<CR><CR>
    noremap <leader>fr :<C-U><C-R>=printf("Leaderf rg")<CR><CR>
    noremap <C-P>      :<C-U><C-R>=printf("Leaderf file %s", "")<CR><CR>
    noremap <C-N>      :<C-U><C-R>=printf("Leaderf mru %s", "")<CR><CR>
    " noremap <C-M>      :<C-U><C-R>=printf("Leaderf mru %s", "")<CR><CR>
    " 修改窗口打开时的默认键映射
    let g:Lf_CommandMap = {
                \   '<C-K>': ['<C-P>', '<C-K>', '<UP>'],
                \   '<C-J>': ['<C-N>', '<C-J>', '<Down>']
                \   }
    " 搜索当前光标下的单词
    noremap <leader>fw :<C-U><C-R>=printf("Leaderf! rg -e %s ",
                \   expand("<cword>"))<CR><CR>
    " 搜索可视模式选择的字符串
    xnoremap <leader>fv :<C-U><C-R>=printf("Leaderf! rg -F -e %s ",
                \   leaderf#Rg#visual())<CR><CR>
    " <Tab> : 在检索模式和选择模式之间切换
    " <C-R> : 在模糊匹配和正则式匹配之间切换
    " <C-F> : 在全路径搜索和名字搜索之间切换
    " <C-X> : 在水平窗口打开
    " <C-]> : 在垂直窗口打开
    " <C-T> : 在新标签打开
    " <C-P> : 预览结果
    " nameonly 模式，可以使用分号分隔，分号前面是文件名，后面是路径。 }}}

endif

" Initialize plugin system
call plug#end()
" 删除此变量
unlet g:plug_url_format

" 有些插件载入后需要在这里进一步设置 {{{

"" autofmt 使用的函数 """"""""""""""""""""""
"" autofmt 针对中文，允许前引号出现在行首，后引号出现在行尾。需要下列代码
if exists('*autofmt#unicode#import')
    let s:unicode = autofmt#unicode#import()
    let s:orig_prop_line_break = s:unicode.prop_line_break
    function! s:unicode.prop_line_break(char)
        if a:char == "\u201c" || a:char == "\u2018"
            return "OP"   " Open Punctuation
        elseif a:char == "\u201d" || a:char == "\u2019"
            return "CL"   " Close Punctuation
        endif
        return call(s:orig_prop_line_break, [a:char], self)
    endfunction
endif

" 以上是插件载入后的设置    }}}

" vim: colorcolumn=1,78
